24442
8853
J'ai accidentellement commis les mauvais fichiers sur Git, mais je n'ai pas encore poussé le commit sur le serveur.
Comment puis-je annuler ces validations du référentiel local? 
1
2
3
Prochain
Annuler un commit et refaire
$ git commit -m "Quelque chose de terriblement malavisé" # (0: Votre accident)
$ git reset HEAD ~ # (1)
<< modifier les fichiers si nécessaire >> # (2)
$ git add. # (3)
$ git commit -c ORIG_HEAD # (4)
Cette commande est responsable de l'annulation. Il annulera votre dernier commit tout en laissant votre arbre de travail (l'état de vos fichiers sur le disque) intact. Vous devrez les ajouter à nouveau avant de pouvoir les valider à nouveau).
Apportez des corrections aux fichiers d'arborescence de travail.
git ajoutez tout ce que vous voulez inclure dans votre nouveau commit.
Validez les modifications en réutilisant l'ancien message de validation. reset a copié l'ancienne tête dans .git / ORIG_HEAD; commit avec -c ORIG_HEAD ouvrira un éditeur, qui contient initialement le message du journal de l'ancien commit et vous permet de le modifier. Si vous n'avez pas besoin de modifier le message, vous pouvez utiliser l'option -C.
Alternativement, pour éditer le commit précédent (ou juste son message de commit), commit --amend ajoutera des changements dans l'index actuel au commit précédent.
Pour supprimer (ne pas annuler) un commit qui a été poussé vers le serveur, la réécriture de l'historique avec git push origin master --force est nécessaire.
Lectures complémentaires
Comment puis-je déplacer HEAD vers un emplacement précédent? (Tête détachée) & Annuler les commits
La réponse ci-dessus vous montrera git reflog, que vous pouvez utiliser pour déterminer le SHA-1 du commit auquel vous souhaitez revenir. Une fois que vous avez cette valeur, utilisez la séquence de commandes comme expliqué ci-dessus.
HEAD ~ est identique à HEAD ~ 1. L'article Qu'est-ce que la HEAD dans git? est utile si vous souhaitez annuler la validation de plusieurs validations.
|
Annuler un commit est un peu effrayant si vous ne savez pas comment cela fonctionne. Mais c'est en fait incroyablement facile si vous comprenez. Je vais vous montrer les 4 façons différentes d'annuler un commit.
option 1: git reset --hard
Disons que vous avez ceci, où C est votre HEAD et (F) est l'état de vos fichiers.
(F)
ABC
↑
Maître
Vous voulez commettre un Nuke C et ne plus jamais le revoir et perdre toutes les modifications des fichiers modifiés localement. Tu fais cela:
git reset --hard HEAD ~ 1
Le résultat est:
(F)
UN B
↑
Maître
Maintenant B est la TÊTE. Comme vous avez utilisé --hard, vos fichiers sont réinitialisés à leur état lors de la validation B.
option 2: réinitialisation de git
Ah, mais supposons que commettre C n'était pas un désastre, mais juste un peu décalé. Vous voulez annuler la validation, mais gardez vos modifications pour un peu d'édition avant de faire une meilleure validation. En recommençant d'ici, avec C comme HEAD:
(F)
ABC
↑
Maître
Vous pouvez le faire, en laissant le --hard:
git reset HEAD ~ 1
Dans ce cas, le résultat est:
(F)
ABC
↑
Maître
Dans les deux cas, HEAD est juste un pointeur vers le dernier commit. Lorsque vous effectuez une réinitialisation git HEAD ~ 1, vous dites à Git de reculer le pointeur HEAD d'un commit. Mais (sauf si vous utilisez --hard) vous laissez vos fichiers tels quels. Alors maintenant, git status montre les changements que vous avez enregistrés dans C. Vous n'avez rien perdu!
option 3: git reset --soft
Pour le toucher le plus léger, vous pouvez même annuler votre commit mais laisser vos fichiers et votre index:
git reset --soft HEAD ~ 1
Cela laisse non seulement vos fichiers seuls, mais même votre index seul. Lorsque vous effectuez git status, vous verrez que les mêmes fichiers sont dans l'index qu'avant. En fait, juste après cette commande, vous pourriez faire git commit et vous referiez le même commit que vous venez d'avoir.
option 4: vous avez réinitialisé git --hard et devez récupérer ce code
Une dernière chose: supposons que vous détruisiez un commit comme dans le premier exemple, mais que vous découvriez ensuite que vous en aviez besoin après tout? Pas de chance, non?
Non, il y a encore un moyen de le récupérer. Tapez git reflog et vous verrez une liste des shas de commit (partiels) (c'est-à-dire des hachages) dans lesquels vous vous êtes déplacé. Trouvez le commit que vous avez détruit, et faites ceci:
git checkout -b someNewBranchName shaYouDestroyed
Vous avez maintenant ressuscité ce commit. Les commits ne sont pas détruits dans Git pendant environ 90 jours, vous pouvez donc généralement revenir en arrière et en sauver un dont vous ne vouliez pas vous débarrasser.
|
Il y a deux façons «d'annuler» votre dernier commit, selon que vous avez ou non déjà rendu votre commit public (poussé vers votre référentiel distant):
Comment annuler un commit local
Disons que je me suis engagé localement, mais maintenant je veux supprimer ce commit.
journal git
commit 101: mauvais commit # Dernier commit. Cela s'appellerait «HEAD».
commit 100: good commit # Avant le dernier commit. C'est celui que nous voulons.
Pour tout restaurer comme avant le dernier commit, nous devons réinitialiser le commit avant HEAD:
git reset --soft HEAD ^ # Utilisez --soft si vous souhaitez conserver vos modifications
git reset --hard HEAD ^ # Utilisez --hard si vous ne vous souciez pas de conserver les modifications que vous avez apportées
Maintenant, git log montrera que notre dernier commit a été supprimé.
Comment annuler un commit public
Si vous avez déjà rendu vos commits publics, vous voudrez créer un nouveau commit qui "annulera" les changements que vous avez faits dans votre commit précédent (HEAD actuel).
git revert HEAD
Vos modifications seront maintenant annuléeset prêt à vous engager:
git commit -m 'restauration du fichier que j'ai supprimé par accident'
journal git
commit 102: restauration du fichier que j'ai supprimé par accident
commit 101: supprimer un fichier dont nous n'avons pas besoin
commit 100: ajouter un fichier dont nous avons besoin
Pour plus d'informations, consultez Git Basics - Undoing Things.
|
Ajoutez / supprimez des fichiers pour obtenir les choses comme vous le souhaitez:
git rm classdir
git ajouter sourcedir
Puis modifiez le commit:
git commit --amend
Le commit précédent, erroné, sera édité pour refléter le nouvel état d'index - en d'autres termes, ce sera comme si vous n'aviez jamais fait l'erreur en premier lieu.
Notez que vous ne devriez faire cela que si vous ne l'avez pas encore fait. Si vous avez poussé, vous devrez simplement valider un correctif normalement.
|
git rm vos fichiers / *. class
git commit -a -m "a supprimé tous les fichiers de classe dans le dossier 'yourfiles'"
ou
git reset --hard HEAD ~ 1
Avertissement: La commande ci-dessus supprimera définitivement les modifications des fichiers .java (et de tout autre fichier) que vous vouliez valider.
La réinitialisation matérielle de HEAD-1 définira votre copie de travail sur l'état de la validation avant votre mauvaise validation.
|
Pour changer le dernier commit
Remplacez les fichiers dans l'index:
git rm --cached * .class
git add * .java
Ensuite, s'il s'agit d'une branche privée, modifiez le commit:
git commit --amend
Ou, s'il s'agit d'une branche partagée, effectuez un nouveau commit:
git commit -m 'Remplacez les fichiers .class par des fichiers .java'
(Pour modifier un commit précédent, utilisez l'impressionnant rebase interactif.)
ProTip ™: Ajoutez * .class à un gitignore pour que cela ne se reproduise plus.
Pour annuler un commit
La modification d'un commit est la solution idéale si vous devez changer le dernier commit, mais une solution plus générale est réinitialisée.
Vous pouvez réinitialiser Git sur n'importe quel commit avec:
git reset @ ~ N
Où N est le nombre de validations avant HEAD et @ ~ réinitialise à la validation précédente.
Donc, au lieu de modifier le commit, vous pouvez utiliser:
git reset @ ~
git add * .java
git commit -m "Ajouter des fichiers .java"
Consultez git help reset, en particulier les sections sur --soft --mixed et --hard, pour une meilleure compréhension de ce que cela fait.
Reflog
Si vous vous trompez, vous pouvez toujours utiliser le reflog pour trouver les commits supprimés:
$ git reset @ ~
$ git reflog
c4f708b HEAD @ {0}: réinitialisation: passage à @ ~
2c52489 HEAD @ {1}: commit: ajout de quelques fichiers .class
$ git reset 2c52489
... et vous êtes de retour là où vous avez commencé
|
Utilisez git revert .
Pour obtenir l'ID de validation, utilisez simplement git log.
|
Si vous prévoyez d'annuler entièrement un commit local, quoi que vous ayez modifié, vous l'avez fait sur le commit, et si vous ne vous inquiétez de rien à ce sujet, exécutez simplement la commande suivante.
git reset --hard HEAD ^ 1
(Cette commande ignorera l'intégralité de votre validation et vos modifications seront complètement perdues de votre arbre de travail local). Si vous souhaitez annuler votre validation, mais que vous souhaitez que vos modifications soient apportées dans la zone de préparation (avant la validation, comme après git add), exécutez la commande suivante.
git reset --soft HEAD ^ 1
Maintenant, vos fichiers validés entrent dans la zone de transit. Supposons que si vous souhaitez améliorer les fichiers, car vous devez modifier un contenu erroné, exécutez la commande suivante
git reset HEAD
Désormais, les fichiers validés doivent provenir de la zone intermédiaire vers la zone non intermédiaire. Maintenant, les fichiers sont prêts à être modifiés, donc quoi que vous changiez, vous voulez aller le modifier et l'ajouter et faire un nouveau commit.
Plus (lien cassé) (version archivée)
|
Si vous avez installé Git Extras, vous pouvez exécuter git undo pour annuler le dernier commit. git undo 3 annulera les trois derniers commits.
|
Je voulais annuler les cinq derniers commits dans notre référentiel partagé. J'ai recherché l'ID de révision sur lequel je voulais revenir. Ensuite, j'ai tapé ce qui suit.
prompt> git reset --hard 5a7404742c85
HEAD est maintenant à 5a74047 Ajout d'une page de plus au catalogue
prompt> git push origin master --force
Total 0 (delta 0), réutilisé 0 (delta 0)
remote: bb / acl: neoneye est autorisé. charge utile acceptée.
À git@bitbucket.org: thecompany / prometheus.git
+ 09a6480 ... 5a74047 maître -> maître (mise à jour forcée)
invite>
|
Je préfère utiliser git rebase -i pour ce travail, car une belle liste apparaît où je peux choisir les commits à supprimer. Ce n'est peut-être pas aussi direct que certaines autres réponses ici, mais cela semble juste.
Choisissez le nombre de commits que vous souhaitez lister, puis invoquez comme ceci (pour enrôler les trois derniers)
git rebase -i HEAD ~ 3
Exemple de liste
choisissez aa28ba7 Sanity check pour le port RtmpSrv
choisissez l'option de version c26c541 RtmpSrv
choisissez 58d6909 Meilleure prise en charge du décodage d'URL
Ensuite, Git supprimera les validations pour toute ligne que vous supprimez.
|
Comment réparer le commit local précédent
Utilisez git-gui (ou similaire) pour effectuer un git commit --amend. À partir de l'interface graphique, vous pouvez ajouter ou supprimer des fichiers individuels du commit. Vous pouvez également modifier le message de validation.
Comment annuler le commit local précédent
Réinitialisez simplement votre branche à l'emplacement précédent (par exemple, en utilisant gitk ou git rebase). Ensuite, réappliquez vos modifications à partir d'une copie enregistrée. Après le garbage collection dans votre référentiel local, ce sera comme si le commit indésirable ne s'était jamais produit. Pour faire tout cela en une seule commande, utilisez git reset HEAD ~ 1.
Motd'avertissement: une utilisation imprudente de git reset est un bon moyen de mettre votre copie de travail dans un état déroutant. Je recommande aux novices de Git d'éviter cela s'ils le peuvent.
Comment annuler un commit public
Effectuez un reverse cherry pick (git-revert) pour annuler les modifications.
Si vous n'avez pas encore apporté d'autres modifications à votre branche, vous pouvez simplement faire ...
git revert --no-edit HEAD
Ensuite, poussez votre branche mise à jour vers le référentiel partagé.
L'historique des validations affichera les deux validations, séparément.
Avancé: Correction de la branche privée dans le référentiel public
Cela peut être dangereux - assurez-vous d'avoir une copie locale de la branche à repousser.
Remarquez également: vous ne souhaitez pas faire cela si quelqu'un d'autre travaille sur la branche.
git push --delete (nom_branche) ## supprimer la version publique de la branche
Nettoyez votre succursale localement puis repousser ...
git push origin (nom_branche)
Dans le cas normal, vous n'avez probablement pas à vous soucier de l'état vierge de votre historique de validation de branche privée. Appuyez simplement sur un commit de suivi (voir «Comment annuler un commit public» ci-dessus), et plus tard, faites un squash-merge pour masquer l'historique.
|
Si vous souhaitez l'annuler définitivement et que vous avez cloné un référentiel
L'identifiant de validation peut être vu par
journal git
Alors tu peux faire -
git reset --hard 
git push origin  -f
|
Si vous avez commis des fichiers indésirables mais pas poussés,
git reset --soft HEAD ~ 1
HEAD ~ 1 est un raccourci pour le commit avant head. Vous pouvez également vous référer au SHA-1 du hachage si vous souhaitez réinitialiser. L'option --soft supprimera le commit mais laissera tous vos fichiers modifiés "Modifications à valider", comme le mettrait git status.
Si vous voulez vous débarrasser de toute modification apportée aux fichiers suivis dans l'arborescence de travail depuis la validation avant head, utilisez plutôt "--hard".
OU
Si vous avez déjà poussé et que quelqu'un a tiré, ce qui est généralement mon cas, vous ne pouvez pas utiliser git reset. Vous pouvez cependant faire un retour git,
git revert HEAD
Cela créera un nouveau commit qui annule tout ce qui a été introduit par le commit accidentel.
|
Sur SourceTree (GUI pour GitHub), vous pouvez cliquer avec le bouton droit sur le commit et faire un 'Reverse Commit'. Cela devrait annuler vos modifications.
Sur le terminal:
Vous pouvez également utiliser:
git revert
Ou:
git reset --soft HEAD ^ # Utilisez --soft si vous souhaitez conserver vos modifications.
git reset --hard HEAD ^ # Utilisez --hard si vous ne vous souciez pas de conserver vos modifications.
|
Une seule commande:
git reset --soft 'HEAD ^'
Cela fonctionne très bien pour annuler le dernier commit local!
|
Réinitialisez-le simplement en utilisant la commande ci-dessous en utilisant git:
git reset --soft HEAD ~ 1
Expliquez: ce que fait git reset, il est fondamentalement réinitialisé sur tout commit auquel vous souhaitez revenir, puis si vous le combinez avec --soft key, il reviendra, mais gardez les modifications dans vos fichiers, donc vous revenez à l'étape où le fichier vient d'être ajouté, HEAD est la tête de la branche et si vous combinez avec ~ 1 (dans ce cas vous utilisez également HEAD ^), il ne retournera qu'un seul commit que vous voulez. ..
Je crée les étapes de l'image ci-dessous plus en détail pour vous, y compris toutes les étapes qui peuvent se produire dans des situations réelles et la validation du code:
|
Comment annuler le dernier commit Git?
Pour tout restaurer comme avant le dernier commit, nous devons réinitialiser le commit avant HEAD.
Si vous ne souhaitez pas conserver les modifications que vous avez apportées:
git reset --hard HEAD ^
Si vous souhaitez conserver vos modifications:
git reset --soft HEAD ^
Maintenant, vérifiez votre journal git. Cela montrera que notre dernier commit a été supprimé.
|
"Réinitialiser l'arborescence de travail au dernier commit"
git reset --hard HEAD ^
"Nettoyer les fichiers inconnus de l'arborescence de travail"
git propre
voir - Référence rapide Git
REMARQUE: cette commande supprimera votre commit précédent, utilisez donc avec prudence! git reset --hard est plus sûr.
|
Utilisez reflog pour trouver un état correct
git reflog
REFLOG AVANT LA RÉINITIALISATION
Sélectionnez le bon reflog (f3cb6e2 dans mon cas) et tapez
git reset --hard f3cb6e2
Après cela, le repo HEAD sera réinitialisé à cet HEADid
LOG APRÈS RÉINITIALISATION
Enfin le reflog ressemble à l'image ci-dessous
REFLOG FINAL
|
Première exécution:
git reflog
Il vous montrera toutes les actions possibles que vous avez effectuées sur votre référentiel, par exemple, valider, fusionner, extraire, etc.
Alors fais:
git reset --hard ActionIdFromRefLog
|
Annuler le dernier commit:
git reset --soft HEAD ^ ou git reset --soft HEAD ~
Cela annulera le dernier commit.
Ici --soft signifie réinitialisé dans la mise en scène.
HEAD ~ ou HEAD ^ signifie se déplacer pour valider avant HEAD.
Remplacez le dernier commit par un nouveau commit:
git commit --amend -m "message"
Il remplacera le dernier commit par le nouveau commit.
|
Autrement:
Extrayez la branche que vous souhaitez restaurer, puis réinitialisez votre copie de travail locale sur le commit que vous voulez être le dernier sur le serveur distant (tout ce qui suit ira au revoir). Pour ce faire, dans SourceTree, j'ai cliqué avec le bouton droit de la souris sur et sélectionné "Réinitialiser BRANCHNAME sur ce commit".
Accédez ensuite au répertoire local de votre référentiel et exécutez cette commande:
git -c diff.mnemonicprefix = false -c core.quotepath = false push -v -f --tags REPOSITORY_NAMEBRANCHNAME: BRANCHNAME
Cela effacera tous les commits après celui en cours dans votre référentiel local, mais uniquement pour cette branche.
|
Tapez git log et recherchez le dernier code de hachage de validation, puis entrez:
git reset 
|
Dans mon cas, j'ai accidentellement commis des fichiers que je ne voulais pas. J'ai donc fait ce qui suit et cela a fonctionné:
git reset --soft HEAD ^
git rm --cached [fichiers dont vous n'avez pas besoin]
git add [fichiers dont vous avez besoin]
git commit -c ORIG_HEAD
Vérifiez les résultats avec gitk ou git log --stat
|
Simple, exécutez ceci dans votre ligne de commande:
git reset --soft HEAD ~
|
Il existe deux scénarios principaux
Vous n'avez pas encore poussé le commit
Si le problème était des fichiers supplémentaires que vous avez validés (et que vous ne voulez pas ceux-ci sur le référentiel), vous pouvez les supprimer en utilisant git rm puis en validant avec --amend
git rm 
Vous pouvez également supprimer des répertoires entiers avec -r, ou même les combiner avec d'autres commandes Bash
git rm -r 
git rm $ (trouver -name '* .class')
Après avoir supprimé les fichiers, vous pouvez valider, avec l'option --amend
git commit --amend -C HEAD # l'option -C consiste à utiliser le même message de commit
Cela réécrira votre récent commit local en supprimant les fichiers supplémentaires, donc, ces fichiers ne seront jamais envoyés par push et seront également supprimés de votre référentiel .git local par GC.
Vous avez déjà poussé le commit
Vous pouvez appliquer la même solution de l'autre scénario, puis faire git push avec l'option -f, mais ce n'est pas recommandé car cela écrase l'historique distant avec un changement divergent (cela peut gâcher votre référentiel).
Au lieu de cela, vous devez faire le commit sans --amend (rappelez-vous ceci à propos de -amend`: Cette option réécrit l'historique lors du dernier commit).
|
Pour un commit local
git reset --soft HEAD ~ 1
ou si vous ne vous souvenez pas exactement de quel commit il s'agit, vous pouvez utiliser
git rm -  en cache
Pour un commit poussé
La bonne façon de supprimer des fichiers de l'historique du référentiel est d'utiliser git filter-branch. C'est,
git filter-branch --index-filter 'git rm --cached ' HEAD
Mais je vous recommande d'utiliser cette commande avec précaution. Pour en savoir plus, consultez la page du manuel git-filter-branch (1).
|
Pour revenir à la révision précédente, en supprimant définitivement toutes les modifications non validées:
git reset --hard HEAD ~ 1
|
QUOI UTILISER, réinitialiser --soft ou réinitialiser --hard?
J'ajoute simplement deux cents pour la réponse de @ Kyralessa:
Si vous ne savez pas quoi utiliser, optez pour --soft (j'ai utilisé cette convention pour m'en souvenir --soft pour plus de sécurité).
Pourquoi ?
Si vous choisissez --hard par erreur, vous PERDREZ vos modifications comme avant.
Si vous choisissez --soft par erreur, vous pouvez obtenir les mêmes résultats que --hard en appliquant des commandes supplémentaires
git reset HEAD file.html
git checkout - fichier.html
Exemple complet
echo "quelques changements ..."> file.html
git add file.html
git commit -m "mauvais commit"
# J'ai besoin de réinitialiser
git reset --hard HEAD ~ 1 (annuler les modifications)
# OU
git reset --soft HEAD ~ 1 # Retour à la mise en scène
git reset HEAD file.html # retour au répertoire de travail
git checkout - file.html # annuler les modifications
Les crédits vont à @Kyralessa.
|
1
2
3
Prochain
Question très active. Gagnez 10 points de réputation pour répondre à cette question. L'exigence de réputation permet de protéger cette question contre les spams et les activités sans réponse.
Ce n'est pas la réponse que vous recherchez? Parcourez les autres questions marquées git version-control git-commit undo ou posez votre propre question.